package base.thread.syn;

/**
 * @Author: my_code
 * @Create: 2020-12-08 19:17
 *
 * 四锁的4个必要条件
 * 1、互斥条件：一个资源每次只能进入一个线程
 * 2、请求与保持：一个进程因为请求资源而阻塞时，对已获得的资源保存不放
 * 3、不剥夺条件：进程以获得的资源，还未使用之前，不能强行剥夺
 * 4、循环等待条件：若干进程之间形成一种头尾相连的循环等待资源关系
 *
 * ps: 我们只要想办法破坏其中任意一个或多个条件就可以比卖你死锁发生
 *
 */
public class DeathLock {
    public static void main(String[] args) {
        new Thread(new OptAB(false,"小王")).start();
        new Thread(new OptAB(true,"大王")).start();
    }
}
class A {}
class B {}

class OptAB extends Thread{

    boolean hasChoice;
    String person;

    static A a = new A();
    static B b = new B();

    OptAB(boolean hasChoice,String person){
        this.person = person;
        this.hasChoice = hasChoice;
    }

    @Override
    public void run() {
        try {
            Opt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void Opt() throws InterruptedException {
        if (hasChoice){
            synchronized (a){
                System.out.println(person+"拿到了A");
                Thread.sleep(1000);

                }
                synchronized (b){
                    System.out.println(person+"拿到了B");
            }
        }else{
            synchronized (b){
                System.out.println(person+"拿到了B");
                Thread.sleep(1000);

                }
                synchronized (a){
                    System.out.println(person+"拿到了A");
            }
        }
    }
}